#include <iostream>
#include <cstdio>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <cstdlib>

int main()
{
    signal(SIGCHLD,SIG_IGN);
    pid_t id = fork();
    if(id == 0)
    {
        std::cout<<"I am a child process,I am running..."<<std::endl;
        sleep(3);
        exit(0);
    }
    while(1);
    return 0;
}


// void handler(int signo)
// {
//     std::cout<<"Get a signal "<<signo<<std::endl;
//     int ret =0;
//     while((ret = waitpid(-1,NULL,WNOHANG) > 0))
//     {
//         std::cout<<"Wait child process success"<<std::endl;
//     }
// }

// int main()
// {
//     signal(SIGCHLD,handler);
//     pid_t id = fork();
//     if(id == 0)
//     {
//         //child
//         std::cout<<"I am a child process,I am running..."<<std::endl;
//         sleep(3);
//         exit(1);
//     }
//     //father
//     while(1);
//     return 0;
// }

// volatile int flag =0;
// void handler(int signo)
// {
//     std::cout<<"Get a signal: "<<signo<<std::endl;
//     flag = 1;
// }

// int main()
// {
//     signal(2,handler);

//     while(!flag);
//     std::cout<<"Normal Quit"<<std::endl;
//     return 0;
// }

// struct sigaction act,oact;
// void handler(int signo)
// {
//     std::cout<<"Get signal: "<<signo<<std::endl;
//     std::cout<<"2号信号正在处理..."<<std::endl;
//     sleep(100);
// }

// int main()
// {
//     pid_t pid = getpid();
//     sigaddset(&act.sa_mask,3);
//     sigaddset(&act.sa_mask,9);
//     act.sa_handler = handler;

//     sigaction(2,&act,&oact);

//     while(1)
//     {
//         std::cout<<"I am a process,my pid: "<<pid<<std::endl;
//         sleep(1);
//     }
//     return 0;
// }


// void printpending(sigset_t* pending)
// {
//     for(int i =31;i>=1;i--)
//     {
//         if(sigismember(pending,i))
//         {
//             std::cout<<"1";
//         }
//         else
//         {
//             std::cout<<"0";
//         }
//     }
//     std::cout<<std::endl;
// }

// void handler(int signo)
// {
//     std::cout<<"Get a signal: "<<signo<<std::endl;
// }

// int main()
// {
//     signal(2,handler);//捕捉二号信号
    
//     sigset_t set,old_set;//初始化
//     sigemptyset(&set);
//     sigemptyset(&old_set);

//     sigaddset(&set,2);
//     sigprocmask(SIG_SETMASK,&set,&old_set);//屏蔽二号信号

//     sigset_t pending;
//     sigpending(&pending);//获取pending表
//     int count = 0;
//     while(1)
//     {
//         sigpending(&pending);
//         printpending(&pending);
//         count++;
//         if(count==10)
//         {
//             sigprocmask(SIG_SETMASK,&old_set,NULL);//恢复二号信号
//             std::cout<<"恢复信号屏蔽字"<<std::endl;
//         }
//         sleep(1);
//     }
//     return 0;
// }


// int main()
// {
//     std::cout<<"I am running"<<std::endl;
//     sleep(2);
//     int* p = nullptr;
//     *p = 100;
//     return 0;
// }


// int count = 0;

// void handler(int signo)
// {
//     std::cout<<"count = "<<count<<std::endl;
// }

// int main()
// {
//     signal(SIGALRM,handler);
//     alarm(1);
//     while(1)
//     {
//         count++;
//     }
//     return 0;
// }


// int main()
// {
// 	int fd[2] = { 0 };
// 	if (pipe(fd) < 0){ //使用pipe创建匿名管道
// 		perror("pipe");
// 		return 1;
// 	}
// 	pid_t id = fork(); //使用fork创建子进程
// 	if (id == 0){
// 		//child
// 		close(fd[0]); //子进程关闭读端
// 		//子进程向管道写入数据
// 		const char* msg = "hello father, I am child...";
// 		int count = 10;
// 		while (count--){
// 			write(fd[1], msg, strlen(msg));
// 			sleep(1);
// 		}
// 		close(fd[1]); //子进程写入完毕，关闭文件
// 		exit(0);
// 	}
// 	//father
// 	close(fd[1]); //父进程关闭写端
// 	close(fd[0]); //父进程直接关闭读端（导致子进程被操作系统杀掉）
// 	int status = 0;
// 	waitpid(id, &status, 0);
// 	printf("child get signal:%d\n", status & 0x7F); //打印子进程收到的信号
// 	return 0;
// }




// void handler(int signo)
// {
//     std::cout<<"Get a signal: "<<signo<<std::endl;
// }

// int main()
// {
//     signal(6,handler);
//     while(1)
//     {
//         sleep(1);
//         abort();
//     }
//     return 0;
// }


// int main()
// {
//     pid_t pid = getpid();
//     while(1)
//     {
//         std::cout<<"I am a process,my pid: "<<pid<<std::endl;
//         sleep(1);
//     }
//     return 0;
// }

// int main(int argc,char* argv[])
// {
//     if(argc!=3)
//     {
//         std::cout<<"Used Fail"<<std::endl;
//     }
//     pid_t pid = atoi(argv[1]);
//     int signo = atoi(argv[2]);
//     kill(pid,signo);
// }



// void handler(int signo)
// {
//     std::cout<<"Get a signal: "<<signo<<std::endl;
// }

// int main()
// {
//     for(int i=1;i<=31;i++)
//     {
//         signal(i,handler);
//     }
//     while(1)
//     {
//         std::cout<<"I am a process,I am waiting a signal!"<<std::endl;
//         sleep(3);
//     }
//     return 0;
// }


// int main()
// {
//     pid_t id = fork();
//     if(id == 0)
//     {
//         std::cout<<"I am a child process"<<std::endl;
//         sleep(3);
//         int x = 1/0;
//         exit(0);
//     }
//     int status = 0;
//     waitpid(-1,&status,0);
// 	printf("exitCode:%d, coreDump:%d, signal:%d\n",(status >> 8) & 0xff, (status >> 7) & 1, status & 0x7f);
//     return 0;
// }

// int main()
// {
//     std::cout<<"I am runing..."<<std::endl;
//     sleep(3);
//     int x = 2/0;//除0！！！
//     return 0;
// }
// void handler(int signo)
// {
//     std::cout<<"Get a signal: "<<signo<<std::endl;
// }

// int main()
// {
//     signal(2,handler);
//     while(1)
//     {
//         std::cout<<"I am a process,I am waiting a signal!"<<std::endl;
//         sleep(1);
//     }
//     return 0;
// }
// int main()
// {
//     while(1)
//     {
//         std::cout<<"I am a process,I am waiting a signal!"<<std::endl;
//         sleep(1);
//     }
//     return 0;
// }
